/**
 * 
 */
package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.IngresoArticuloDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpbDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpdDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpmTransaccionArticulo;
import com.pe.pgn.clubpgn.domain.ClpmStockAlmacenCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNAlmacen;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoDetalle;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticulo;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

/**
 * @author Frank
 */

@Repository("ingresoArticuloDao")
public class IngresoArticuloDaoImpl extends GenericDaoHibernate<ClpbDocumentoMovArticulo, Long> implements IngresoArticuloDao {

	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public IngresoArticuloDaoImpl() {
		super(ClpbDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public List<ClpbAlmacen> obtenerTodosAlmacenConStock() {
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	id, de_almacen as deAlmacen ");
		query.append(" from clpb_almacen ");
		query.append(" where 1 = 1 ");
		query.append(" 	and st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 	and st_es_almacen_virtual = '").append(CLPConstantes.ST_FALSO).append("'");
		query.append(" 	order by de_almacen asc");
		return findListOfBeans(query.toString(), null, ClpbAlmacen.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> obtenerTodosArticulos() {
		
		String strFechaDoc = "to_char(cast(" +
		"dm.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select * from (");		
		query.append(" select ");
		query.append(" 		dm.id, ");
		query.append(" 		"+strFechaDoc+" 	  as daFechaDocumento, ");
		query.append(" 		dm.de_proveedor		  as deProveedor, ");
		query.append(" 		dm.de_documento		  as deDocumento, ");
		query.append(" 		dm.co_almacen		  as coAlmacen,   ");
		query.append(" 		alm.de_almacen 		  as deAlmacen	  ");
		query.append(" from clpb_documento_mov_articulo dm ");
		query.append(" inner join clpb_almacen alm ");
		query.append(" 		on alm.id = dm.co_almacen ");
		query.append(" where 1 = 1 ");
		query.append(" 		and dm.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dm.st_indicador_tipo_documento = '").append(CLPConstantes.ST_DOCUMENTO_INGRESO_ARTICULO).append("'");
		query.append(" order by dm.id desc ");
		query.append(" ) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> busquedaTodosArticulos(
			String coAlmacen, String daFinDoc, String deDocumento,
			String deProveedor, String daInicioDoc) {

		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daInicioDoc);
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daFinDoc);
        }catch(Exception e){
        	//entra aca si el parametro dado no es una fecha
        	daInicioDoc = "";
        	daFinDoc 	= "";
        }
        
        String strFechaDoc = "to_char(cast(" +
		"dm.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		dm.id, ");
		query.append(" 		"+strFechaDoc+" 	  as daFechaDocumento, ");
		query.append(" 		dm.de_proveedor		  as deProveedor, ");
		query.append(" 		dm.de_documento		  as deDocumento, ");
		query.append(" 		dm.co_almacen		  as coAlmacen,   ");
		query.append(" 		alm.de_almacen 		  as deAlmacen	  ");
		query.append(" from clpb_documento_mov_articulo dm ");
		query.append(" inner join clpb_almacen alm ");
		query.append(" 		on alm.id = dm.co_almacen ");
		query.append(" where 1 = 1 ");
		query.append(" 		and dm.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dm.st_indicador_tipo_documento = '").append(CLPConstantes.ST_DOCUMENTO_INGRESO_ARTICULO).append("'");
		
		if (StringUtils.isNotBlank(coAlmacen) && !"null".equals(coAlmacen) && !"-1".equals(coAlmacen))
			query.append(" and dm.co_almacen = ").append(coAlmacen);
		
		if (StringUtils.isNotBlank(daInicioDoc) && StringUtils.isNotBlank(daFinDoc)){
			query.append(" and (dm.da_fecha_documento >= to_date('"+daInicioDoc+"'," +
			"'"+CLPConstantes.DATE_PATTERN+"') and dm.da_fecha_documento <= to_date('"+daFinDoc+"','"+CLPConstantes.DATE_PATTERN+"'))");
		}
		
		if (StringUtils.isNotBlank(deDocumento) && !"null".equals(deDocumento))
			query.append(" and upper(dm.de_documento) like upper(").append("'%"+deDocumento+"%')");
		
		if (StringUtils.isNotBlank(deProveedor) && !"null".equals(deProveedor))
			query.append(" and dm.de_proveedor = ").append("'%"+deProveedor+"%'");
		
		query.append(" order by dm.id desc ");
		System.out.println("****** IngresoArticuloDaoImpl.busquedaTodosArticulos()");
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public BNDocumentoMovArticulo obtenerArticuloIngresado(Long id) {

		String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		dma.id, ");
		query.append(" 		"+strFechaDoc+"		 as daFechaDocumento, ");
		query.append(" 		dma.de_proveedor	 as deProveedor, ");
		query.append(" 		dma.de_documento	 as deDocumento, ");
		query.append(" 		dma.co_almacen		 as coAlmacen, ");
		query.append(" 		alm.de_almacen		 as deAlmacen, ");
		query.append(" 		dma.de_observaciones as deObservacion ");
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" inner join clpb_almacen alm ");
		query.append(" 		on alm.id = dma.co_almacen ");
		query.append(" where 1 = 1 ");
		query.append(" 		and dma.id = ").append(id);
		query.append(" 		and dma.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dma.st_indicador_tipo_documento = '").append(CLPConstantes.ST_DOCUMENTO_INGRESO_ARTICULO).append("'");
		
		System.out.println("Obteniendo BASE: "+query.toString());
		List<BNDocumentoMovArticulo> list = findListOfBeans
		(query.toString(), null, BNDocumentoMovArticulo.class);
		
		if(!list.isEmpty()){
			
			BNDocumentoMovArticulo bndocumento = 
			(BNDocumentoMovArticulo)list.get(0);
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	dta.co_articulo 		as coArticulo, ");
			query.append(" 	art.de_articulo 		as deArticulo, ");
			query.append(" 	unm.de_unidad_medida	as deUnidadMedida,   ");
			query.append(" 	art.co_codigo_articulo	as coCodigoArticulo, ");
			query.append(" 	dta.va_cantidad 		as vaCantidad		 ");			
			query.append(" from clpd_documento_mov_articulo dta ");
			query.append(" inner join clpd_articulo art ");
			query.append(" 		on art.id = dta.co_articulo ");
			query.append(" inner join clpd_unidad_medida unm ");
			query.append(" 		on unm.id = art.co_unidad_medida ");
			query.append(" where 1 = 1 ");
			query.append(" 	and dta.co_documento_mov_articulo = ").append(id);
			query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			System.out.println("Obteniendo DETALLE: "+query.toString());
			List<BNDocumentoDetalle> listDetalle = findListOfBeans
			(query.toString(), null, BNDocumentoDetalle.class);
			
			if(!listDetalle.isEmpty())
			bndocumento.setDocumentoDetalle(listDetalle);			
			
			return bndocumento;
		}
		
		return new BNDocumentoMovArticulo();
	}

	@SuppressWarnings("unchecked")
	public List<BNArticulo> obtenerArticulosConStock() {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	art.id					as coArticulo, ");
		query.append(" 	art.de_articulo			as deArticulo, ");
		query.append(" 	cat.de_categoria		as deCategoria, ");
		query.append(" 	art.co_codigo_articulo	as coCodigoArticulo, ");
		query.append(" 	und.de_unidad_medida	as deUnidadMedida, ");
		query.append(" 	art.va_stock_actual		as vaStockActual, ");
		query.append(" 	art.va_stock_disponible as vaStockDisponible, ");
		query.append(" 	art.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
		query.append(" 	art.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
		query.append(" 	art.st_instantaneo_normal	as stInstantaneoNormal ");
		query.append(" from clpd_articulo art  ");
		query.append(" inner join clpb_categoria cat ");
		query.append(" 	on cat.id = art.co_categoria ");
		query.append(" inner join clpd_unidad_medida und ");
		query.append(" 	on und.id = art.co_unidad_medida ");
		query.append(" where  ");
		query.append("  (art.st_maneja_stock_punto_canje='Y' OR art.st_maneja_stock_alm_principal='Y' OR art.st_instantaneo_normal='Y') ");
		query.append(" 	and art.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 	and art.st_no_maneja_stock = '").append(CLPConstantes.ST_FALSO).append("'");
		
		System.out.println("IngresoArticuloDaoImpl.obtenerArticulosConStock() "+query.toString());
		return findListOfBeans(query.toString(), null, BNArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNArticulo> buscarArticulosConStock(String coCategoria,
			String deArticulo, String coCodigoArticulo, String stManejaStock,
			String stManejaSerie) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	art.id					as coArticulo, ");
		query.append(" 	art.de_articulo			as deArticulo, ");
		query.append(" 	cat.de_categoria		as deCategoria, ");
		query.append(" 	art.co_codigo_articulo	as coCodigoArticulo, ");
		query.append(" 	und.de_unidad_medida	as deUnidadMedida, ");
		query.append(" 	art.va_stock_actual		as vaStockActual, ");
		query.append(" 	art.va_stock_disponible as vaStockDisponible, ");
		query.append(" 	art.st_maneja_stock_punto_canje		as stManejaStockPuntoCanje, ");
		query.append(" 	art.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
		query.append(" 	art.st_instantaneo_normal	as stInstantaneoNormal ");
		query.append(" from clpd_articulo art  ");
		query.append(" inner join clpb_categoria cat ");
		query.append(" 	on cat.id = art.co_categoria ");
		query.append(" inner join clpd_unidad_medida und ");
		query.append(" 	on und.id = art.co_unidad_medida ");
		query.append(" where 1 = 1 ");
		query.append("  and (art.st_maneja_stock_punto_canje='Y' OR art.st_maneja_stock_alm_principal='Y' OR art.st_instantaneo_normal='Y') ");
		query.append(" 	and art.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 	and art.st_no_maneja_stock = '").append(CLPConstantes.ST_FALSO).append("'");
		
		if (StringUtils.isNotBlank(coCategoria) && !"-1".equals(coCategoria)){
			query.append(" 	and art.co_categoria = ").append(coCategoria);
		}
		
		if (StringUtils.isNotBlank(deArticulo)){
			query.append(" 	and upper(art.de_articulo) like upper(").append("'%"+deArticulo+"%')");
		}
		
		if (StringUtils.isNotBlank(coCodigoArticulo)){
			query.append(" 	and upper(art.co_codigo_articulo) like upper(").append("'%"+coCodigoArticulo+"%')");
		}
		
		if(StringUtils.isNotBlank(stManejaStock) && !stManejaStock.equalsIgnoreCase("-1")){
			
			if(stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_PUNTO_CANJE)){
				query.append("	and art.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_ALMACEN_PRINCIPAL)){
				query.append("	and art.st_maneja_stock_alm_principal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_PREMIO_INSTANTANEO_NORMAL)){
				query.append("	and art.st_instantaneo_normal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
		}
		
		if(StringUtils.isNotBlank(stManejaSerie) && !stManejaSerie.equalsIgnoreCase("-1")){
			query.append("	and art.st_maneja_serie = '").append(stManejaSerie).append("'");			
		}
		
		System.out.println("IngresoArticuloDaoImpl.buscarArticulosConStock() "+query.toString());
		return findListOfBeans(query.toString(), null, BNArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public BNArticulo obtenerDatosArticuloPorCodigo(String coCodigoArticulo) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	art.id					as coArticulo, 		 ");
		query.append(" 	art.de_articulo			as deArticulo, 		 ");
		query.append(" 	und.de_unidad_medida	as deUnidadMedida, 	 ");
		query.append(" 	art.va_stock_actual		as vaStockActual, 	 ");
		query.append(" 	art.va_stock_disponible	as vaStockDisponible, ");
		query.append(" 	art.st_maneja_stock_punto_canje as stManejaStockPuntoCanje, ");
		query.append(" 	art.st_maneja_stock_alm_principal as stManejaStockAlmPrincipal, ");
		query.append(" 	art.st_instantaneo_normal	as stInstantaneoNormal ");
		query.append(" from clpd_articulo art  ");
		query.append(" inner join clpd_unidad_medida und ");
		query.append(" 	on und.id = art.co_unidad_medida ");
		query.append(" where 1 = 1 ");
		
		query.append(" 	and art.co_codigo_articulo = '").append(coCodigoArticulo).append("'");
		query.append(" 	and art.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 	and art.st_no_maneja_stock = '").append(CLPConstantes.ST_FALSO).append("'");
		
		System.out.println("IngresoArticuloDaoImpl.obtenerDatosArticuloPorCodigo() "+query.toString());
		List<BNArticulo> list = findListOfBeans(query.toString(), null, BNArticulo.class);
		
		if(!list.isEmpty()){
			return (BNArticulo)list.get(0);
		}else{
			return new BNArticulo();
		}
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public Map guardarDocumentoIngresoArticulo(BNDocumentoMovArticulo bnArticulo) {

		Map map = new HashMap();
		Map mapMaestro = new HashMap();
		Map mapArticulo = new HashMap();
		//se inicia la transaccion para guardar todo el bloque
		
		try{
			
			List<BNDocumentoDetalle> listDtl = 
			bnArticulo.getDocumentoDetalle();
			
			ClpbAlmacen clpbAlmacen = new ClpbAlmacen();
			clpbAlmacen.setId(new Long(bnArticulo.getCoAlmacen()));
			
			//BASE
			ClpbDocumentoMovArticulo objBean = new ClpbDocumentoMovArticulo();
			objBean.setClpbAlmacen(clpbAlmacen);
			objBean.setDaFechaDocumento(Calendar.getInstance());
			objBean.setDeProveedor(bnArticulo.getDeProveedor());
			objBean.setDeDocumento(bnArticulo.getDeDocumento());
			objBean.setDeObservaciones(bnArticulo.getDeObservacion());
			
			objBean.setStDocumentoMovArticulo(true);
			objBean.setStIndicadorTipoDocumento(CLPConstantes.ST_DOCUMENTO_INGRESO_ARTICULO);
			objBean.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			objBean.setDaFechaCreacion(Calendar.getInstance());
			
			//guardando el registro base
			getHibernateTemplate().saveOrUpdate(objBean);
			
			//DETALLE
			if(!listDtl.isEmpty()){
				for (BNDocumentoDetalle beandetalle : listDtl) {
					if (StringUtils.isNotBlank(beandetalle.getCoArticulo())){
					
						ClpdArticulo clpdArticulo = new ClpdArticulo();
						clpdArticulo.setId(new Long(beandetalle.getCoArticulo()));
											
						ClpdDocumentoMovArticulo objBeanDetalle = new ClpdDocumentoMovArticulo();
						objBeanDetalle.setClpbDocumento(objBean);
						objBeanDetalle.setClpdArticulo(clpdArticulo);
						objBeanDetalle.setVaCantidad(new BigDecimal(beandetalle.getVaCantidad()));					
						objBeanDetalle.setStDocumentoMovArticulo(true);
						objBeanDetalle.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
						objBeanDetalle.setDaFechaCreacion(Calendar.getInstance());
						
						//guardando el registro detalle
						getHibernateTemplate().saveOrUpdate(objBeanDetalle);						
						////////////////////////////////////////////////////
						
						ClpmTransaccionArticulo clpmTransaccion = new ClpmTransaccionArticulo();
						clpmTransaccion.setClpdArticulo(clpdArticulo);
						clpmTransaccion.setCoCodigoArticulo(beandetalle.getCoCodigoArticulo());
						clpmTransaccion.setStIndicadorTipoMovimiento(CLPConstantes.INGRESO_DE_ARTICULO);
						
						clpmTransaccion.setVaCantidad(new BigDecimal(beandetalle.getVaCantidad()));
						clpmTransaccion.setClpbAlmacen(clpbAlmacen);
						clpmTransaccion.setClpbDocumentoMovArticulo(objBean);
						clpmTransaccion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
						clpmTransaccion.setDaFechaCreacion(Calendar.getInstance());
						getHibernateTemplate().saveOrUpdate(clpmTransaccion);
						
						////////////////////////////////////////////////////////
						////////////////////////////////////////////////////////
						//Actualizamos campos en la tabla stock almacen catalogo
						
						if(mapMaestro.get(clpbAlmacen.getId()+"-"+clpdArticulo.getId()) == null){							
							mapMaestro.put(clpbAlmacen.getId()+"-"+clpdArticulo.getId(), beandetalle.getVaCantidad());							
						}else{
							
							String strCantidad = String.valueOf(mapMaestro.get(clpbAlmacen.getId()+"-"+clpdArticulo.getId()));							
							long vaCantidad = Long.parseLong(strCantidad) + Long.parseLong(beandetalle.getVaCantidad());					
							mapMaestro.put(clpbAlmacen.getId()+"-"+clpdArticulo.getId(), vaCantidad);
						}					
						
						
						///////////////////////////////////////
						///////////////////////////////////////
						//Actualizando campos en tabla articulo
						
						if(mapArticulo.get(beandetalle.getCoArticulo()) == null){
							
							long vaCantidad = Long.parseLong(beandetalle.getVaCantidad());							
							mapArticulo.put(beandetalle.getCoArticulo(), vaCantidad);
							
						}else{
							
							long vaCantidad = Long.parseLong(mapArticulo.
							get(beandetalle.getCoArticulo()).toString()) + 
							Long.parseLong(beandetalle.getVaCantidad());
							
							mapArticulo.put(beandetalle.getCoArticulo(), vaCantidad);
						}					
					}
				}
			}
			
			/**
			 * @author frank.ayala
			 * @description : actualizando en stock almacen catalogo
			 * */
			
			Set<String> setMaestro  = mapMaestro.keySet();
			Set<String> setArticulo = mapArticulo.keySet();
			Iterator<String> itr    = setMaestro.iterator();
			Iterator<String> itrx   = setArticulo.iterator();
			
			int indice = 0;		
			String[] arrayStr = new String[setMaestro.size() + setArticulo.size()];
			
			while (itr.hasNext()) {
				
				String strKey     = itr.next();
		    	String[] arrayKey = strKey.split("-");
		    	Long vaCantidadAcum = new Long(String.valueOf(mapMaestro.get(strKey)));
				
		    	Long coAlmacen = new Long(arrayKey[0]);
	    		ClpbAlmacen clpbAlmacenO = new ClpbAlmacen();
	    		clpbAlmacenO.setId(coAlmacen);
	    		
				Long coArticulo = new Long(arrayKey[1]);					
				ClpdArticulo clpdArticulo = new ClpdArticulo();
				clpdArticulo.setId(coArticulo);
				
				StringBuffer query = new StringBuffer();
				query.append(" select ");
				query.append(" 	id,va_cantidad ");
				query.append(" from clpm_stock_almacen_catalogo ");
				query.append(" where co_articulo = ").append(clpdArticulo.getId());
				query.append("	 and co_almacen  = ").append(clpbAlmacenO.getId());
				query.append("   and co_catalogo is null ");
				query.append("   and co_premio   is null");
				query.append("	 and st_stock_almacen_catalogo = '");
				query.append(CLPConstantes.ST_VERDADERO).append("'");
				
				Long id = null;
				List list = jdbcTemplate.queryForList(query.toString());
				if(!list.isEmpty()){
					Map objMap = (HashMap)list.get(0);
					id  = new Long(objMap.get("id").toString());
				}
		    	
				if(id == null){ // insert
					
					ClpmStockAlmacenCatalogo clpmStockAlmacenCatalogo = new ClpmStockAlmacenCatalogo();
					clpmStockAlmacenCatalogo.setClpdArticulo(clpdArticulo);
					clpmStockAlmacenCatalogo.setClpbAlmacen(clpbAlmacenO);
					clpmStockAlmacenCatalogo.setVaCantidad(new BigDecimal(vaCantidadAcum));
					clpmStockAlmacenCatalogo.setStStockAlmacenCatalogo(true);
					clpmStockAlmacenCatalogo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					clpmStockAlmacenCatalogo.setDaFechaCreacion(Calendar.getInstance());
					clpmStockAlmacenCatalogo.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
					clpmStockAlmacenCatalogo.setDaFechaModificacion(Calendar.getInstance());
					getHibernateTemplate().saveOrUpdate(clpmStockAlmacenCatalogo);
					
					// query para no dejar vacio el indice
					arrayStr[indice] = ValidationUtil.getQueryDefault();
					indice++;
					
				}else{ // update

					query = new StringBuffer();
					query.append(" update clpm_stock_almacen_catalogo ");
					query.append(" set ");
					query.append(" 		va_cantidad = decode(va_cantidad,null,"+vaCantidadAcum+",va_cantidad + "+vaCantidadAcum+"),");
					query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
					query.append(" 		da_fecha_modificacion  = sysdate");
					query.append(" where id = ").append(id);
					
					arrayStr[indice] = query.toString();
					indice++;
				}				
			}
			
			/**
			 * @author frank.ayala
			 * @description : actualizando en articulos
			 * */
			
			StringBuffer query = new StringBuffer();			
			while (itrx.hasNext()) {				
				String strKey = itrx.next();
				Long vaCantidad = new Long(mapArticulo.get(strKey).toString());
		    	
				query = new StringBuffer();
				query.append(" update clpd_articulo ");
				query.append(" set ");
				query.append(" 		va_stock_actual = decode(va_stock_actual,null,"+vaCantidad+",va_stock_actual + "+vaCantidad+"),");
				query.append(" 		va_stock_disponible = decode(va_stock_disponible,null,"+vaCantidad+",va_stock_disponible + "+vaCantidad+"),");
				query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
				query.append(" 		da_fecha_modificacion  = sysdate");
				query.append(" where id = ").append(strKey);
				
				arrayStr[indice] = query.toString();
				indice++;
			}
			
			///////////////////////////////
			///////////////////////////////
			getHibernateTemplate().flush();
			jdbcTemplate.batchUpdate(arrayStr);
			
			for (int i = 0; i < arrayStr.length; i++) {
				System.out.println(i+"* update detalle guardarDocumentoIngresoArticulo(): "+arrayStr[i]);
			}
			
			map.put("msg", "success");
			map.put("id" , objBean.getId());
			///////////////////////////////
			///////////////////////////////
			
			bnArticulo.setId(objBean.getId());
			bnArticulo.setDeAlmacen(obtenerDescripcionAlmacenPorID
			(bnArticulo.getCoAlmacen()));
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			map.put("msg", "error");
			log.info(e.getMessage());
		}
		
		return (HashMap)map;
	}

	private String obtenerDescripcionAlmacenPorID(String coAlmacen) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" de_almacen ");
		query.append(" from clpb_almacen ");
		query.append(" where id = ").append(coAlmacen);
		
		return jdbcTemplate.queryForObject(query.toString(), String.class);
	}

	@SuppressWarnings("rawtypes")
	public BNAlmacen obtenerDatosAlmacenPorCodigo(String coAlmacen) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		de_almacen			    as deAlmacen, ");
		query.append(" 		st_es_punto_canje	    as stEsPuntoCanje, ");
		query.append(" 		st_es_almacen_virtual   as stEsAlmacenVirtual,  ");
		query.append(" 		st_es_almacen_principal as stEsAlmacenPrincipal ");
		query.append(" from clpb_almacen ");
		query.append(" where id = ").append(coAlmacen);
		
		System.out.println("IngresoArticuloDaoImpl.obtenerDatosAlmacenPorCodigo() "+query.toString());
		List list = findListOfBeans(query.toString(), null, BNAlmacen.class);
		
		if(!list.isEmpty()){
			return (BNAlmacen)list.get(0);
		}else{
			return new BNAlmacen();
		}
	}	
}
